home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Commun⁄Network / atp-sample-code.c
Internet Message Format  |  1994-03-23  |  5KB

  1. From: Stuart Cheshire <cheshire@cs.stanford.edu>
  2. Subject: Re: Looking for some sample appletalk ATP code... 
  3. Date: Wed, 2 Sep 92 18:11:08 GMT 
  4.  
  5. In article <1992Sep1.033635.28604@sunb10.cs.uiuc.edu> Alex Bratton,
  6. bratton@sparc3.cs.uiuc.edu writes:
  7. >If you have some sample code (ATP) that opens, registers, and dumps some
  8. >data, I'd really appreciate seeing it.  This has been bugging me for a
  9. while
  10. >and I think I need to look at some working code to see what I'm missing.
  11.  
  12. Here is some more sample code, which opens and registers an ATP socket.
  13. It is from the Macintosh User Authenticator mentioned in a previous post
  14. be me.
  15.  
  16. The code is written for Think C 5.
  17.  
  18. #include <Traps.h>
  19. #include <GestaltEqu.h>
  20. #include <Folders.h>
  21. #include <AppleTalk.h>
  22.  
  23. #define local static
  24. #define export
  25. #define import extern
  26. typedef unsigned char  BYTE;
  27. typedef unsigned short WORD;
  28. typedef unsigned long  DWORD;
  29. #define until(A) while (!(A))
  30.  
  31. typedef struct
  32.     {
  33.     BYTE sysLAPAddr;
  34.     BYTE destnode;
  35.     BYTE srcnode;
  36.     BYTE ALAPproto;
  37.     WORD length;
  38.     union
  39.         {
  40.         struct
  41.             {
  42.             BYTE destsocket;
  43.             BYTE srcsocket;
  44.             BYTE DPPproto;
  45.             BYTE userdata[15];
  46.             } shortheader;
  47.         struct
  48.             {
  49.             WORD checksum;
  50.             WORD destnet;
  51.             WORD srcnet;
  52.             BYTE destnode;
  53.             BYTE srcnode;
  54.             BYTE destsocket;
  55.             BYTE srcsocket;
  56.             BYTE DPPproto;
  57.             BYTE userdata[7];
  58.             } longheader;
  59.         } u;
  60.     BYTE unused;
  61.     BYTE sysABridge;
  62.     WORD sysNetNum;
  63.     WORD vSCCEnable;
  64.     } MPPglobals;
  65.  
  66. extern MPPglobals *ABusVars : 0x2D8;
  67.  
  68. typedef struct
  69.     {
  70.     ATPParamBlock p;
  71.     long *myglobals;
  72.     } myATPParamBlock;
  73.  
  74. local NamesTableEntry myNTE;    /* DONT TOUCH THIS -- IT'S USED CONTINUOUSLY
  75. BY NBP */
  76.  
  77. // name must be 8 characters long
  78. local void construct_name(AddrBlock addr, unsigned char *name)
  79.     {
  80.     static unsigned char hextable[] = "0123456789ABCDEF";
  81.     name[0] = 7;
  82.     name[1] = hextable[(addr.aNet  >> 12) & 0xF];
  83.     name[2] = hextable[(addr.aNet  >>  8) & 0xF];
  84.     name[3] = hextable[(addr.aNet  >>  4) & 0xF];
  85.     name[4] = hextable[(addr.aNet  >>  0) & 0xF];
  86.     name[5] = '.';
  87.     name[6] = hextable[(addr.aNode >>  4) & 0xF];
  88.     name[7] = hextable[(addr.aNode >>  0) & 0xF];
  89.     }
  90.  
  91. local void awaitrequest(void);
  92. local void acceptrequest(void)
  93.     {
  94.     static char dummy;
  95.     static BDSElement bds;
  96.     
  97.     myATPParamBlock *atp_pb;
  98.     long *saveGptr;
  99.     asm    {    move.l    GLOBREG, saveGptr
  100.             move.l    a0, atp_pb
  101.             move.l    myATPParamBlock.myglobals(a0), GLOBREG
  102.         }
  103.     
  104.     // if (atp_pb->p.ATPioResult) What to do if error?
  105.  
  106. // do whatever you want here to prepare your response...
  107.     
  108.     bds.buffSize  = sizeof(dummy);
  109.     bds.buffPtr   = (Ptr)&dummy;
  110.     bds.dataSize  = 0;
  111.     bds.userBytes = 0;
  112.     
  113.     atp_pb->p.ATPioCompletion = awaitrequest;
  114.     atp_pb->p.ATPatpFlags   = atpEOMvalue;
  115.     atp_pb->p.ATPbdsPointer = (Ptr)&bds;
  116.     atp_pb->p.ATPnumOfBuffs = 1;
  117.     atp_pb->p.ATPbdsSize    = 1;
  118.     
  119.     PSendResponse(&atp_pb->p, TRUE);
  120.  
  121.     asm { move.l saveGptr, GLOBREG }
  122.     }
  123.  
  124. local void awaitrequest(void)
  125.     {
  126.     static MACAUTH_REQUEST req;
  127.     myATPParamBlock *atp_pb;
  128.     long *saveGptr;
  129.     asm    {    move.l    GLOBREG, saveGptr
  130.             move.l    a0, atp_pb
  131.             move.l    myATPParamBlock.myglobals(a0), GLOBREG
  132.         }
  133.     atp_pb->p.ATPioCompletion = acceptrequest;
  134.     atp_pb->p.ATPatpSocket    = myNTE.nt.nteAddress.aSocket;
  135.     atp_pb->p.ATPreqLength    = sizeof(req);
  136.     atp_pb->p.ATPreqPointer   = (Ptr)&req;
  137.     PGetRequest(&atp_pb->p, TRUE);
  138.     asm { move.l saveGptr, GLOBREG }
  139.     }
  140.  
  141. local OSErr AppleTalkInit(void)    // returns non-zero if init failed
  142.     {
  143.     OSErr retcode;
  144.     short MPPRefNum;
  145.     MPPParamBlock p;
  146.     ATPParamBlock atp;
  147.     static myATPParamBlock req_pb;
  148.     static AddrBlock zeroaddress;
  149.     static unsigned char regname[8];
  150.     
  151.     if (retcode = OpenDriver("\p.MPP", &MPPRefNum))
  152.         { DebugStr("\pCouldn't open AppleTalk driver"); return(retcode); }
  153.  
  154.     p.SETSELF.newSelfFlag = TRUE;
  155.     PSetSelfSend(&p, FALSE);     // no need to abort if this fails
  156.     
  157.     atp.ATPatpSocket = 0;
  158.     atp.ATPaddrBlock = zeroaddress;
  159.     if (retcode = POpenATPSkt(&atp, FALSE))
  160.         { DebugStr("\pCouldn't open ATP socket"); return(retcode); }
  161.  
  162.     myNTE.nt.nteAddress.aNet    = ABusVars->sysNetNum;
  163.     myNTE.nt.nteAddress.aNode   = ABusVars->sysLAPAddr;
  164.     myNTE.nt.nteAddress.aSocket = atp.ATPatpSocket;
  165.     
  166.     construct_name(myNTE.nt.nteAddress, regname);
  167.  
  168.     NBPSetNTE((Ptr)&myNTE,
  169.         (Ptr)regname, (Ptr)"\pMacintosh Authenticator", (Ptr)"\p*",
  170.         myNTE.nt.nteAddress.aSocket);
  171.     
  172.     p.NBPinterval    = 2;
  173.     p.NBPcount       = 2;
  174.     p.NBPntQElPtr    = (Ptr)&myNTE;
  175.     p.NBPverifyFlag  = TRUE;
  176.     if (retcode = PRegisterName(&p, FALSE))
  177.         { DebugStr("\pCouldn't Register name"); return(retcode); }
  178.  
  179.     asm    {    move.l    GLOBREG, req_pb.myglobals
  180.             lea        req_pb, a0
  181.             bsr        awaitrequest
  182.         }
  183.     }
  184.  
  185.  
  186. Stuart Cheshire <cheshire@cs.stanford.edu>
  187.  * Liliore Green Rains Houses Resident Computer Coordinator
  188.  * Stanford Distributed Systems Group Research Assistant
  189.  * Macintosh Programmer
  190.  
  191.  
  192.